# Copyright 2024 The HuggingFace Inc. team. All rights reserved.



# 用于设置机械臂的硬件参数、相机配置以及动作限制等
from dataclasses import dataclass, field

from lerobot.cameras import CameraConfig

from ..config import RobotConfig


# 用于初始化 SO-100 Follower 机械臂（参考你之前提供的 SO100Follower 类），设置串口、相机和安全参数。
@RobotConfig.register_subclass("so100_follower")
@dataclass
class SO100FollowerConfig(RobotConfig):
    port: str       # 机械臂连接的串口地址

    disable_torque_on_disconnect: bool = True   # 在断开机械臂连接时是否禁用电机扭矩

    max_relative_target: int | None = None  # 限制机械臂关节目标位置相对于当前位置的最大变化量，用于安全控制
    # 可以设置为：
        # 正整数：对所有电机应用相同的限制（例如，限制每个关节每次移动的最大角度或步长）。
        # 列表：为每个电机分别指定限制（列表长度需与电机数量匹配，例如 6 个电机）。
        # None：不施加限制，允许任意目标位置。


    # 定义机械臂使用的相机配置，键为相机名称（如 "main"），值为 CameraConfig 对象。
    cameras: dict[str, CameraConfig] = field(default_factory=dict)

    # 指定关节位置的单位是否为角度（degrees）
    use_degrees: bool = False
    # 默认值为 False，表示使用归一化的范围
    # 如果设为 True，表示使用角度单位（degree），为了与旧版策略或数据集保持兼容。


@RobotConfig.register_subclass("so100_follower_end_effector")
@dataclass
class SO100FollowerEndEffectorConfig(SO100FollowerConfig):
    """Configuration for the SO100FollowerEndEffector robot."""

    # Default bounds for the end-effector position (in meters)
    end_effector_bounds: dict[str, list[float]] = field(
        default_factory=lambda: {
            "min": [-1.0, -1.0, -1.0],  # min x, y, z
            "max": [1.0, 1.0, 1.0],  # max x, y, z
        }
    )

    max_gripper_pos: float = 50

    end_effector_step_sizes: dict[str, float] = field(
        default_factory=lambda: {
            "x": 0.02,
            "y": 0.02,
            "z": 0.02,
        }
    )
